iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0
佛心分享-IT 人自學之術

OpwnCV影像處理新手村系列 第 17

🚀 DAY 17:影像輪廓與形狀分析(Contours & Shape Analysis)

  • 分享至 

  • xImage
  •  

影像輪廓(Contours)是一種用於檢測與分析物體邊界的技術,常見於物體追蹤、形狀分析、物體計數等場景。透過輪廓分析,可以精確取得物件外型、大小與位置,為後續辨識與分類奠定基礎。


🔹 什麼是輪廓 (Contours)?

  • 輪廓是影像中物件邊界的曲線集合。
  • 在進行輪廓偵測前,通常需將影像二值化(Binary)或進行邊緣檢測,以強化物體邊界。
  • 輪廓偵測對物件辨識、形狀分析、尺寸量測等任務非常有幫助。

🖼 測試圖片準備

請準備一張二值化圖片 image.png,並放在與程式同一資料夾。

import cv2

img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 進行二值化處理
_, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Binary', binary)

# 讀取二值化影像
img_gray = binary

# 將灰階或二值影像轉為彩色 BGR,方便繪製彩色輪廓
img_color = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2BGR)

# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()

https://ithelp.ithome.com.tw/upload/images/20250920/20129482mxpvhV9VVK.png


🔹 1. 查找輪廓 (cv2.findContours)


# 查找輪廓
contours, hierarchy = cv2.findContours(img_gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 在彩色影像上繪製輪廓
cv2.drawContours(img_color, contours, -1, (0, 0, 255), 2)  # 紅色輪廓

cv2.imshow('Contours', img_color)

📌 參數說明

  • cv2.findContours(image, mode, method)

    • image:輸入二值化影像。
    • mode:輪廓檢索方式,如 cv2.RETR_EXTERNAL(僅最外層)或 cv2.RETR_TREE(含層級結構)。
    • method:輪廓近似方法,如 cv2.CHAIN_APPROX_SIMPLE(壓縮冗餘點)或 cv2.CHAIN_APPROX_NONE(保留所有點)。
  • cv2.drawContours(image, contours, contourIdx, color, thickness)

    • contourIdx=-1:繪製所有輪廓。
    • color:BGR 顏色。
    • thickness:線寬,-1 代表填滿。

效果:紅色線條標示物件輪廓,邊界清晰可見。

https://ithelp.ithome.com.tw/upload/images/20250920/20129482wTgZqI8SZq.png


🔹 2. 輪廓面積與周長


# 計算每個輪廓的面積與周長
for i, cnt in enumerate(contours):
  area = cv2.contourArea(cnt)
  perimeter = cv2.arcLength(cnt, True)
  print(f'輪廓{i}: 面積={area}, 周長={perimeter}')

🔹 3. 形狀近似 (ApproxPolyDP)


# 形狀近似:將輪廓簡化為多邊形
for i, cnt in enumerate(contours):
  epsilon = 0.02 * cv2.arcLength(cnt, True)
  approx = cv2.approxPolyDP(cnt, epsilon, True)
  cv2.drawContours(img_color, [approx], -1, (0, 255, 0), 2)  # 綠色近似輪廓

cv2.imshow('Approximated Contours', img_color)

效果:

https://ithelp.ithome.com.tw/upload/images/20250920/20129482dAuGKAI8hT.png


🔹 4. 外接矩形與圓形


# 外接矩形與圓形:分析物件外型
for cnt in contours:
  x, y, w, h = cv2.boundingRect(cnt)
  cv2.rectangle(img_color, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 藍色矩形
  (cx, cy), radius = cv2.minEnclosingCircle(cnt)
  cv2.circle(img_color, (int(cx), int(cy)), int(radius), (0, 255, 255), 2)  # 黃色圓形

cv2.imshow('Bounding Rect & Circle', img_color)

效果:

https://ithelp.ithome.com.tw/upload/images/20250920/20129482SuB6XJk1nO.png


📊 方法比較

方法 說明
contourArea 計算輪廓面積,反映物件大小
arcLength 計算輪廓周長,反映物件邊界長度
approxPolyDP 將輪廓近似為多邊形,便於形狀分析
boundingRect 計算外接矩形,取得物件位置與尺寸
minEnclosingCircle 計算最小外接圓,分析物件圓度與包覆性

比較:面積與周長可用於物件篩選與分類,形狀近似便於辨識多邊形物件,外接矩形與圓形則有助於定位與形狀特徵分析。


📖 今日結語

透過彩色輪廓繪製,我們能清楚觀察二值化影像的物件邊界,並進一步進行面積、周長、形狀近似、外接矩形與圓形等分析。這些技術是影像分析與物體辨識的重要基礎,能協助精確分割、分類與量測物件。


上一篇
🚀 DAY 16:邊緣檢測(Edge Detection)|Sobel、Laplacian、Canny
下一篇
🚀 DAY 18:影像直方圖與直方圖均衡化(Histogram & Histogram Equalization)
系列文
OpwnCV影像處理新手村22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言